﻿using System;
using web_uchet.Models;
using System.Linq;
using System.Data.Objects;
using System.Collections.Generic;
using Mvc.Validation;
using Mvc.Validation.Validators;
using web_uchet.Security.Enums;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using System.Configuration;
using web_uchet.Security;
namespace web_uchet.ViewModels
{
    public interface IViewКомпания
    {
        Компания Компания { get; }
        DateTimeOffset? Дата_Послед_Активн { get; set; }
        int ИД_Компании { get; }
        System.Data.Objects.DataClasses.EntityCollection<Клиент> Клиенты { get; set; }
        string Контакты { get; set; }
        System.Data.Objects.DataClasses.EntityCollection<Место_Работы> Места_Работы { get; set; }
        string Название { get; set; }
        System.Data.Objects.DataClasses.EntityCollection<Пользователь> Пользователи { get; set; }
        string Сообщение { get; }
        float Счет { get; }
        string ФИО_Представителя { get; set; }
    }
    [System.Web.Mvc.Bind(Exclude = "Дата_Послед_Активн,ИД_Компании,Сообщение,Счет")]
    public class ViewКомпания : IViewКомпания
    {
        protected Компания _Компания;
        public Компания Компания { get { return this._Компания; } }
        public ViewКомпания()
        {
            this._Компания = new Компания();
        }
        public ViewКомпания(Компания Base)
        {
            this._Компания = Base;
        }
        #region IViewКомпания Members

        public DateTimeOffset? Дата_Послед_Активн
        {
            get
            {
                return this._Компания.Дата_Послед_Активн;
            }
            set
            {
                this._Компания.Дата_Послед_Активн = value;
            }
        }

        public int ИД_Компании
        {
            get { return this._Компания.ИД_Компании; }
        }

        public System.Data.Objects.DataClasses.EntityCollection<Клиент> Клиенты
        {
            get
            {
                return this._Компания.Клиенты;
            }
            set
            {
                this._Компания.Клиенты = value;
            }
        }
        [NotNullOrEmptyValidator(MessageTemplate="Контакты обязательны для заполнения")]
        [StringLengthValidator(100, MessageTemplate = "Не более 100 символов")]
        public string Контакты
        {
            get
            {
                return this._Компания.Контакты;
            }
            set
            {
                if (value == null) this._Компания.Контакты = string.Empty;
                else
                    this._Компания.Контакты = value;
            }
        }

        public System.Data.Objects.DataClasses.EntityCollection<Место_Работы> Места_Работы
        {
            get
            {
                return this._Компания.Места_Работы;
            }
            set
            {
                this._Компания.Места_Работы = value;
            }
        }
        [StringLengthValidator(30, MessageTemplate = "Не более 30 символов")]
        public string Название
        {
            get
            {
                return this._Компания.Название;
            }
            set
            {
                if (value == null) this._Компания.Название = string.Empty;
                else
                    this._Компания.Название = value;
            }
        }

        public System.Data.Objects.DataClasses.EntityCollection<Пользователь> Пользователи
        {
            get
            {
                return this._Компания.Пользователи;
            }
            set
            {
                this._Компания.Пользователи = value;
            }
        }

        public string Сообщение
        {
            get
            {
                return this._Компания.Сообщение;
            }
            //set
            //{
            //    this._Компания.Сообщение = value;
            //}
        }

        public float Счет
        {
            get
            {
                return this._Компания.Счет;
            }
            //set
            //{
            //    this._Компания.Счет = value;
            //}
        }
        [NotNullOrEmptyValidator(MessageTemplate = "ФИО представителя(контактного лица) обязательны для заполнения")]
        [StringLengthValidator(50, MessageTemplate = "Не более 50 символов")]
        public string ФИО_Представителя
        {
            get
            {
                return this._Компания.ФИО_Представителя;
            }
            set
            {
                if (value == null) this._Компания.ФИО_Представителя = string.Empty;
                else
                    this._Компания.ФИО_Представителя = value;
            }
        }

        #endregion
    }

    public class ViewКомпанияOperationProvider
    {
        const float AccountDecriment = 0.33F;
        private ModelWebUchetCon _Context;

        public ViewКомпанияOperationProvider()
        {
            this._Context = new ModelWebUchetCon(ModelWebUchetCon.SingleToneConnection);
        }
        public ViewКомпанияOperationProvider(ModelWebUchetCon Context)
        {
            this._Context = Context;
        }

        //v CompanyID - ID компании для которой делаем LIST
        public  ViewКомпания List(int CompanyID)
        {
            return new ViewКомпания(this._Context.Компании.First(e => e.ИД_Компании == CompanyID));
        }
        public ViewКомпания Details(int CompanyID,ProgramContext SecurirtyData)
        {
            if (CompanyID == SecurirtyData.CompanyID)
                return new ViewКомпания(this._Context.Компании.First(e => e.ИД_Компании == CompanyID));
            else throw new System.Security.SecurityException("Попытка получить данные чужой компании");
        }

        public void Delete(int CompanyID)
        {
            throw new NotImplementedException("Удаление компании со всеми связанными данны ми пока не реализовано");
            this._Context.DeleteObject(
            this._Context.Компании.First(e => e.ИД_Компании == CompanyID));
            this._Context.SaveChanges(true);
        }
        //public void Update(ViewКомпания Company)
        //{
        //    //this._Context.Refresh(RefreshMode.ClientWins, Company);
        //    this._Context.SaveChanges(true);
        //}
        public void SaveChanges()
        {
            this._Context.SaveChanges(true);
        }

        public void Create(ViewКомпания Company)
        {
            this._Context.AddToКомпании(Company.Компания);
            this._Context.SaveChanges(true);
        }

        public void RegularAccountCorrect()
        {

            Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
            DateTime LastCall = Convert.ToDateTime(
            myConfiguration.AppSettings.Settings["LastAccountCorrectTime"].Value);
            DateTime Now = DateTime.Now;
            if (Now.Date == LastCall.Date) return;
            else
            {
                foreach (var Company in this._Context.Компании)
                    Company.Счет -= AccountDecriment;
                this.SaveChanges();
                myConfiguration.AppSettings.Settings["LastAccountCorrectTime"].Value = Now.Date.ToString();
                myConfiguration.Save();
            }
        }
    }
}
